/*
 * To change this license header, choose License Headers in Project Properties.
 * To change this template file, choose Tools | Templates
 * and open the template in the editor.
 */
package pessoas.dao;

import contatoplugin.ContatoAbstract;
import daobase.DaoAbstractFactory;
import daobase.IDao;
import java.io.FileNotFoundException;
import java.util.ArrayList;
import pessoas.collection.Usuarios;
import pessoas.model.Contato;
import pessoas.model.Usuario;
import txtdao.FabricaTxtConcreta;
import usuarioplugin.UsuarioAbstract;

/**
 *
 * @author Bush
 */
public class FacadeDao implements IDao {

    private static FacadeDao instancia;
    private DaoAbstractFactory fabricaAbstrata;
    private IDao dao;

    private FacadeDao() {
        fabricaAbstrata = new FabricaTxtConcreta();
        dao = fabricaAbstrata.criaDaoConcreta();
    }

    public static FacadeDao getInstancia() {
        if (instancia == null) {
            instancia = new FacadeDao();
        }
        return instancia;
    }

    public void setDao(DaoAbstractFactory fabrica, ArrayList<Contato> c, ArrayList<Contato> i) throws FileNotFoundException {
        Usuarios usuarios = Usuarios.getInstancia();
        this.dao = fabrica.criaDaoConcreta();        
        this.dao.liparGravarContatos(c);
        this.dao.limpaGravaContatoInvalido(i);
        this.dao.limpaGravaUsuario(usuarios.getUsuarios());
    }

    @Override
    public void gravarContato(ContatoAbstract c) {
        dao.gravarContato(c);
    }

    @Override
    public void liparGravarContatos(ArrayList c) {
        dao.liparGravarContatos(c);
    }

    @Override
    public ArrayList lerContatos() {
        ArrayList<Contato> contatos;
        contatos = castContato(dao.lerContatos());
        return contatos;
    }

    @Override
    public void gravarContatosInvalido(ContatoAbstract c) {
        dao.gravarContatosInvalido(c);
    }

    @Override
    public void limpaGravaContatoInvalido(ArrayList c) {
        dao.limpaGravaContatoInvalido(c);
    }

    @Override
    public ArrayList lerContatosInvalido() {
        ArrayList<Contato> contatos;
        contatos = castContato(dao.lerContatosInvalido());
        return contatos;
    }   

    @Override
    public ArrayList carregaUsuarios() {
        ArrayList<Usuario> usuarios;
        usuarios = castUsuario(dao.carregaUsuarios());
        return usuarios;
    }

    @Override
    public void gravaUsuario(UsuarioAbstract u) {
        dao.gravaUsuario(u);
    }

    @Override
    public void limpaGravaUsuario(ArrayList u) {
        dao.limpaGravaUsuario(u);
    }
    
    private ArrayList<Usuario> castUsuario(ArrayList<UsuarioAbstract> u){
         ArrayList<Usuario> usuarios = new ArrayList<Usuario>();
        for (int i = 0; i < u.size(); i++) {
            Usuario usuario = new Usuario(null, null);
            usuario.setNomeUsuario(u.get(i).getNomeUsuario());
            usuario.setSenhaUsuario(u.get(i).getSenhaUsuario());
            usuarios.add(usuario);
        }
        return usuarios;
    }
    
    private ArrayList<Contato> castContato(ArrayList<ContatoAbstract> al) {
        ArrayList<Contato> contatos = new ArrayList<Contato>();
        for (int i = 0; i < al.size(); i++) {
            Contato contato = new Contato(null, null, null, null, null);
            contato.setId(al.get(i).id);
            contato.setNome(al.get(i).nome);
            contato.setOperadora(al.get(i).operadora);
            contato.setSobrenome(al.get(i).sobrenome);
            contato.setTelefone(al.get(i).telefone);
            contato.setUf(al.get(i).uf);
            contatos.add(contato);
        }
        return contatos;
    }
}
